/**
 * rust 为什么要推出智能指针？ 为什么不能直接使用引用？
 * 核心的目的：简化代码编写。因为所有权和引用导致代码比较难于阅读
 *
 * 
 * 
 * 1.智能指针的定义
 *    表现上类似指针，但拥有额外的元数据和功能。
 *    大部分情况下，智能指针对指向的数据具有所有权，而不仅仅是一个引用
 * 2.智能指针的类型
 *   引用计数
 *   非引用计数
 *   有元数据指针
 *   无元数据指针
 *
 *
 * 3.智能指针的实现
 *   Deref --允许智能指针结构体实例表现的像引用一样，这样就可以编写既用于引用、又用于智能指针的代码
 *   Drop  --自定义当智能指针离开作用域时运行的代码
 *
 * 4.系统已经具有的智能指针
 *   智能指针是一个在 Rust 经常被使用的通用设计模式
 *   String
 *   Vec
 *   Box
 *   Rc
 *   Ref,RefMut
 *
 *
 * Box
 *   最简单直接的智能指针是 box，其类型是 Box<T>。box 允许你将一个值放在堆上而不是栈上。留在栈上的则是指向堆数据的指针
 *   可以用于定义递归类型，这样编译器可以在编译的时候就知道其大小
 */

/**
 * 通过枚举定义一个递归，当然也完全可以通过结构定义一个递归
 */
enum RecursiveEnum {
    Data(i32, Box<RecursiveEnum>),
    Nil,
}

struct RecursiveStruct {
    data: i32,
    next: Option<Box<RecursiveStruct>>,
}

use RecursiveEnum::{ Data, Nil };

fn main() {
    //这两种无论哪一种都是比较怪异的。在实际编程中基本上不可能这样去初始化数据
    let list = Data(1, Box::new(Data(2, Box::new(Data(3, Box::new(Nil))))));
    let org = RecursiveStruct {
        data: 1,
        next: Some(
            Box::new(RecursiveStruct {
                data: 2,
                next: Some(
                    Box::new(RecursiveStruct {
                        data: 3,
                        next: None,
                    })
                ),
            })
        ),
    };
}
